<?php

namespace app\api\controller\v1;

use think\Controller;
use think\Request;
use think\facade\Validate;
use think\Db;
use app\api\validate\User as UserValidate;

class Common extends Controller {

    protected $validater; //用来验证数据/参数
    protected $params; //过滤后符合要求的参数

    protected function initialize() {
        $this->check_time(request()->only('time'));
        $this->check_token(request()->only(['user_name','user_pwd','time','token'])); //$this->check_token($this->request->param()); //token加密 md5(api_md5(用户名)+md5(密码)+md5(时间戳)_api)
//        
        //$this->check_params(request()->except(['time', 'token']));
    }

    /**
     * 验证请求是否超时
     * @param array $arr 包含时间戳的参数数组
     * @return json 请求结果
     */
    public function check_time($arr) {
        if (!isset($arr['time']) || intval($arr['time']) <= 1) {
            $this->msg(400, '时间戳错误！');
        }
        if (time() - intval($arr['time']) > 60) {
            $this->msg(401, '请求超时！');
        }
    }

    /**
     * 验证token防止篡改数据
     * @param array $arr 全部请求参数
     * @return json token验证结果
     */
    public function check_token($arr) {
        //api 传递过来的token
        if (!isset($arr['token']) || empty($arr['token'])) {
            $this->msg(400, 'token不能为空！');
        }
        $app_token = $arr['token']; //api传递过来的token
        //服务器生成token
        unset($arr['token']);
        $service_token = '';
        foreach ($arr as $k => $v) {
            $service_token .= md5($v);
        }
        $service_token = md5('api_' . $service_token . '_api'); //服务器即时生成的token
        // 对比token
        if ($app_token != $service_token) {
            $this->msg(400, 'token值错误！');
        }
    }

    /**
     * 验证参数  参数过滤
     * @param array $arr 除time和token以外的所有参数
     * @return json 合格的参数数组
     */
    public function check_params($arr) {
//        //验证参数并返回错误
//        $this->validater = new Validate($rule);
//        if(!$this->validater->check($arr)){
//            $this->msg(400, $this->validater->getError());
//        }
//        $validate = new UserValidate();
//        $controller = $this->request->action();
//        if (!$validate->scene($controller)->check($arr)) {
//            $this->msg(400, $validate->getError());
//        }
        //通过验证
        $this->params = $arr;
    }
    
    /**
     * 检测用户名并返回用户名类型
     * @param string $username 用户名，可能是邮箱，可能是手机号
     * @return string 检测结果
     */
    public function check_username($username){
        $is_email = Validate::isEmail($username)?1:0; //判断是否是邮箱
        $is_phone = preg_match('/^1[3456789]\d{9}$/',$username)?4:2;//判断是否是手机号
        $flag = $is_email + $is_phone;
        switch ($flag) {
            case 2: //不是phone 不是email
                $this->msg(400,'邮箱或手机号格式错误！');
                break;
            case 3://是email不是phone
                return 'email';
                break;
            case 4://不是email是phone 
                return 'phone';
                break;
            default:
                $this->msg(400,'邮箱或手机号格式错误！');
                break;
        }
    }
    
    public function check_exist($value,$type='phone',$exist=0){
        $type_num = $type=='phone'?2:4;
        $flag = $type_num + $exist;
        $phone_res = db('user')->where('user_phone',$value)->find();
        $email_res = db('user')->where('user_email',$value)->find();
        switch ($flag) {
            case 2://2+0 用户注册
                if($phone_res){
                    $this->msg(400,'手机号已被占用！');
                }
                break;
            case 3://2+1 查询手机号是否存在 
                if(!$phone_res){
                    $this->msg(400,'此手机不存在！');
                }
                break;
            case 4://4+0 邮箱注册
                if($email_res){
                    $this->msg(400,'邮箱号已被占用！');
                }
                break;
            case 5://4+1 查询邮箱是否存在
                if(!$email_res){
                    $this->msg(400,'此邮箱不存在！');
                }
                break;
            default:
                break;
        }
    }
    
    /**
     * 检测验证码是否正确
     * @param string $user_name 用户名
     * @param int $code 验证码
     * @return json api返回的JSON数据
     */
    
    public function check_code($user_name,$code){
        /* 检测是否超时，默认1分钟 */
        /* 处理用户名中的.符号，在thinkphp中.代表二位数组 */
        $session_user_name = str_replace(".","_",$user_name);
        
        $last_time = session($session_user_name.'_last_send_time');
        if(time() - $last_time >300){
            $this->msg(400,'验证超时，请在5分钟内完成验证！');
        }
        /* 检测验证码是否正确 */
        if(session($session_user_name.'_code') != md5($user_name . '-' . md5($code))){
            $this->msg(400,'验证码错误！');
        }
        /* 不管正确与否，每个验证码只验证一次 */
        session($session_user_name.'_code',null);
    }

    /**
     * 
     * @param type $code 返回的接口码 200正常 4**错误 5** 服务器错误
     * @param type $msg  返回的消息
     * @param type $data 返回的数据
     * @return json 最终返回的结果
     */
    public function msg($code, $msg = '', $data = []) {
        $return_data['code'] = $code;
        $return_data['msg'] = $msg;
        $return_data['data'] = $data;
        echo json_encode($return_data);
        die();
        //return json($return_data);
    }

}
